package com.kfpanda.search.index.entity;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

import org.apache.log4j.Logger;
import org.apache.lucene.document.Document;
import org.apache.lucene.queryParser.core.util.StringUtils;
import org.springframework.stereotype.Repository;

import com.kfpanda.search.index.Documentor;

import static org.apache.lucene.document.Field.Store;
import static org.apache.lucene.document.Field.Index;

/**
 * ClassName: EntityDocumentor <br>
 * <b>Description:<b><br>
 * 将java实体转化成Document文档。
 * 
 * @Author: kfpanda
 * @Date：2012-1-6 下午10:33:28
 * @ModifyDate：2012-1-6 下午10:33:28
 */
@Repository("entityDocumentor")
public class EntityDocumentor<T> implements Documentor<T>{
	private Logger logger = Logger.getLogger(EntityDocumentor.class);
	
	/**
	 * <b>Description:<b><br>
	 * 将java实体转化成Document文档。
	 * @param t
	 * @return
	 * @Author: kfpanda
	 * @ModifyUser：kfpanda
	 * @Date：2012-1-8 下午03:59:44
	 */
	@Override
	public Document document(T t) {
		Document doc = new Document();
		Field[] fields = t.getClass().getDeclaredFields();
		Method[] methods = t.getClass().getMethods();
		for(Field field : fields){
			String fieldName = field.getName().toLowerCase();
			String methodName = "get" + fieldName;
			for(Method method : methods){
				//查找方法，并获取get 方法值。
				if(methodName.equals(method.getName().toLowerCase())){
					try {
						Object value = method.invoke(t, new Object[]{});
						String val = (value == null) ? "" : StringUtils.toString(value);
						doc.add(new org.apache.lucene.document.Field(fieldName, 
								val, Store.YES, Index.NOT_ANALYZED));
						break;
					} catch (IllegalAccessException e) {
						logger.debug(e);
					} catch (IllegalArgumentException e) {
						logger.debug(e);
					} catch (InvocationTargetException e) {
						logger.debug(e);
					}
				}
			}
		}
		return doc;
	}
	
}
